<?php

require_once 'models/DAL/ProdutosDAO.php';
require_once 'models/DAL/CoresDAO.php';
require_once 'models/DAL/TamanhosDAO.php';

class Application_Model_DbTable_Produtos extends Zend_Db_Table_Abstract {

    protected $_name = 'Produtos';
    protected $_primary = 'idProdutos';
    protected $_dependentTables = array(
        'Application_Model_DbTable_Categoria',
        'Application_Model_DbTable_CoresProdutosHasProdutos',
        'Application_Model_DbTable_TamanhosHasProdutos'
    );

    public function getAllProdutos() {
        $retorno = array();

        $rows = $this->select()
                ->setIntegrityCheck(false)
                ->from(array('p' => $this->_name), array(
                    'p.*',
                    'l.nome as nomeLinha',
                    'l.imagePath as imageLinha',
                    'c.categoria',
                    'c.ImagePath as imageCategoria',
                        )
                )
                ->join(array('l' => 'Linha'), 'p.idLinha = l.idLinha')
                ->join(array('c' => 'Categoria'), 'p.idCategoria = c.idCategoria');

        $rows = $this->fetchAll($rows)->toArray();

        foreach ($rows as $row) {
            $dao = new Application_Model_DAO_Produtos();

            $dao->setIdProdutos($row['idProdutos']);
            $dao->setNome($row['nome']);
            $dao->setCodigo($row['codigo']);
            $dao->setDescricao($row['descricao']);
            $dao->setStatus($row['status']);
            $dao->setEstoque($row['estoque']);

            $linha = new Application_Model_DAO_Linhas();
            $linha->setIdLinha($row['idLinha']);
            $linha->setNome($row['nomeLinha']);
            $linha->setImagePath($row['imageLinha']);

            $categoria = new Application_Model_DAO_Categoria();
            $categoria->setIdCategoria($row['idCategoria']);
            $categoria->setCategoria($row['categoria']);
            $categoria->setImagePath($row['imageCategoria']);

            $dao->setCategoria($categoria);
            $dao->setLinhas($linha);

            $cores = $this->select()
                    ->setIntegrityCheck(false)
                    ->from(array('cohp' => 'CoresProduto_has_Produtos'), array(
                        'cohp.*',
                        'cp.idCoresProduto as idCorProduto',
                        'cp.nomeCor',
                        'cp.hex'
                            )
                    )
                    ->join(array('cp' => 'CoresProduto'), 'cohp.idCoresProduto = cp.idCoresProduto ')
                    ->where('cohp.idProdutos = ?', $row['idProdutos']);

            $cores = $this->fetchAll($cores)->toArray();

            foreach ($cores as $cor) {
                $rs = new Application_Model_DAO_Cores();

                $rs->setIdCores($cor['idCorProduto']);
                $rs->setNomeCor($cor['nomeCor']);
                $rs->setHex($cor['hex']);

                $dao->addCor($rs);
            }


            $retorno[] = $dao;
        }



        return $retorno;
    }

    public function getProdutoById($id) {
        $row = $this->select()
                ->setIntegrityCheck(false)
                ->from(array('p' => $this->_name), array(
                    'p.*',
                    'l.nome as nomeLinha',
                    'l.imagePath as imageLinha',
                    'c.categoria',
                    'c.ImagePath as imageCategoria',
                        )
                )
                ->join(array('l' => 'Linha'), 'p.idLinha = l.idLinha')
                ->join(array('c' => 'Categoria'), 'p.idCategoria = c.idCategoria')
                ->where('p.idProdutos = ?', (int) $id);

        $row = $this->fetchRow($row)->toArray();


        $dao = new Application_Model_DAO_Produtos();

        $dao->setIdProdutos($row['idProdutos']);
        $dao->setNome($row['nome']);
        $dao->setCodigo($row['codigo']);
        $dao->setDescricao($row['descricao']);
        $dao->setStatus($row['status']);

        $linha = new Application_Model_DAO_Linhas();
        $linha->setIdLinha($row['idLinha']);
        $linha->setNome($row['nomeLinha']);
        $linha->setImagePath($row['imageLinha']);

        $categoria = new Application_Model_DAO_Categoria();
        $categoria->setIdCategoria($row['idCategoria']);
        $categoria->setCategoria($row['categoria']);
        $categoria->setImagePath($row['imageCategoria']);

        $dao->setCategoria($categoria);
        $dao->setLinhas($linha);

        $cores = $this->select()
                ->setIntegrityCheck(false)
                ->from(array('cohp' => 'CoresProduto_has_Produtos'), array(
                    'cohp.*',
                    'cp.idCoresProduto as idCorProduto',
                    'cp.nomeCor',
                    'cp.hex'
                        )
                )
                ->join(array('cp' => 'CoresProduto'), 'cohp.idCoresProduto = cp.idCoresProduto ')
                ->where('cohp.idProdutos = ?', $row['idProdutos']);

        $cores = $this->fetchAll($cores)->toArray();

        foreach ($cores as $cor) {
            $rs = new Application_Model_DAO_Cores();

            $rs->setIdCores($cor['idCorProduto']);
            $rs->setNomeCor($cor['nomeCor']);
            $rs->setHex($cor['hex']);

            $dao->addCor($rs);
        }

        $tamanhos = $this->select()
                ->setIntegrityCheck(false)
                ->from(array('tahp' => 'Tamanhos_has_Produtos'), array(
                    'tahp.*',
                    'ta.idTamanhos as idTamanho',
                    'ta.tamanho'
                        )
                )
                ->join(array('ta' => 'Tamanhos'), 'tahp.idTamanhos = ta.idTamanhos ')
                ->where('tahp.idProdutos = ?', $row['idProdutos']);

        $tamanhos = $this->fetchAll($tamanhos)->toArray();

        foreach ($tamanhos as $tamanho) {
            $rs = new Application_Model_DAO_Tamanhos();
            $rs->setIdTamanhos($tamanho['idTamanho']);
            $rs->setTamanho($tamanho['tamanho']);

            $dao->addTamanho($rs);
        }


        return $dao;
    }

    public function getAllProdutosByLinhaId($id) {
        $retorno = array();
        $rows = $this->select()
                ->where('idLinha = ?', (int) $id)
                ->from(array('p' => $this->_name), array(
            'p.idProdutos',
            'p.imagePath'
        ));
        $rows = $this->fetchAll($rows)->toArray();

        foreach ($rows as $row) {
            $dao = new Application_Model_DAO_Produtos();

            $dao->setIdProdutos($row['idProdutos']);

            $retorno[] = $dao;
        }

        return $retorno;
    }

    public function getAllProdutosByCategoriaId(Application_Model_DAO_Categoria $categoria) {
        $retorno = array();

        $select = $this->select()->where('idCategoria = ?', (int) $categoria->getIdCategoria());



        return $retorno;
    }

    public function getAllProdutosByValues(array $params) {

        $retorno = array();
        $rows = $this
                ->select()
                ->setIntegrityCheck(false)
                ->from(
                        array('p' => $this->_name), array(
                    'p.idProdutos',
                    'p.nome',
                    'p.imagePath',
                    'p.idCategoria',
                    'p.idLinha',
                    'l.nome as nomeLinha'
                        )
                )
                ->join(array('l' => 'Linha'), 'p.idLinha = l.idLinha');


        $where = NULL;
        foreach ($params as $key => $param) {

            if ($param == '0') {
                unset($params[$key]);
            }
        }

        foreach ($params as $key => $param) {
            $rows->where('p.id' . ucfirst($key) . '=?', $param);
        }

        $rows->where('p.status = ?', TRUE);

        $rows = $this->fetchAll($rows)->toArray();


        foreach ($rows as $row) {
            $dao = new Application_Model_DAO_Produtos();

            $dao->setIdProdutos($row['idProdutos']);
            $dao->setNome($row['nome']);
            $dao->setImagePath($row['imagePath']);

            $linha = new Application_Model_DAO_Linhas();
            $linha->setNome($row['nome']);

            $dao->setLinhas($linha);

            $cores = $this->select()
                    ->setIntegrityCheck(false)
                    ->from(array('cohp' => 'CoresProduto_has_Produtos'), array(
                        'cohp.*',
                        'cp.idCoresProduto as idCorProduto',
                        'cp.nomeCor',
                        'cp.hex',
                            )
                    )
                    ->join(array('cp' => 'CoresProduto'), 'cohp.idCoresProduto = cp.idCoresProduto ')
                    ->where('cohp.idProdutos = ?', $row['idProdutos']);
            $cores = $this->fetchAll($cores)->toArray();

            foreach ($cores as $cor) {
                $rs = new Application_Model_DAO_Cores();

                $rs->setIdCores($cor['idCorProduto']);
                $rs->setNomeCor($cor['nomeCor']);
                $rs->setHex($cor['hex']);

                $dao->addCor($rs);
            }


            $retorno[] = $dao;
        }

        return $retorno;
    }

}